package jp.ac.u_tokyo.dch.util;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.xwork.StringUtils;

import jp.ac.u_tokyo.dch.model.PageInfo;


/**
 *
 * @version 1.1
 *
 * @param <T> リスト画面に表示するオブジェクト
 */
public abstract class PageUtil<T> {

	/**
	 * ページオブジェクトを生成
	 * @param currentPage 現在ページ
	 * @param viewPageCnt 表示件数
	 * @param searchKeyMap 検索条件
	 * @return ページオブジェクト
	 * @throws Exception 例外
	 */
	public PageInfo<T> createPageInfo(String currentPage,String viewPageCnt, Map<String,String> searchKeyMap) throws Exception  {

		PageInfo<T> page = new PageInfo<T>();

		int currentP = 1;

		if (!StringUtils.isEmpty(currentPage)) {
			currentP =Integer.valueOf(currentPage);
		}

		int viewPage =Integer.valueOf(viewPageCnt);
		int start = viewPage*(currentP-1);
		//int end = currentP*viewPage;
		int totalCnt = getSearchResultCnt(searchKeyMap);
		int totalPage = 0;

		if((totalCnt%viewPage) > 0){
			totalPage = (totalCnt/viewPage)+1;
		}else{
			totalPage = totalCnt/viewPage;
		}

		int result = currentP/10;
		if(currentP % 10 > 0){
			result = result+1;
		}
		int startPage = currentP > 6 ? (currentP-5):(((result-1)*10)+1);
		int endPage =   startPage+9;
		int previousPage = startPage -10;
		int nextPage =0;
		if (endPage >= totalPage){
			endPage = totalPage;
		}else{
			nextPage = endPage+1;
		}

		List<T> searchResult = getSearchResultList(start, Integer.valueOf(viewPageCnt), searchKeyMap);

		page.setTotalCnt(totalCnt);
		page.setDataList(searchResult);
		page.setTotalPage(totalPage);
		page.setCurrentPage(currentP);
		page.setStartPage(startPage);
		page.setEndPage(endPage);
		page.setNextPage(nextPage);
		page.setPreviousPage(previousPage);


		return page;
	}

	/**
	 * 検索件数を取得する
	 * @param searchKeyMap 検索条件
	 * @return 検索件数
	 * @throws Exception 例外
	 */
	protected abstract int getSearchResultCnt(Map<String,String> searchKeyMap)throws Exception;

	/**
	 * 検索結果を取得する
	 * @param start 開始インデックス
	 * @param end 終了インデックス
	 * @param searchKeyMap 検索条件
	 * @return 検索結果リスト
	 * @throws Exception 例外
	 */
	protected abstract List<T> getSearchResultList(int start, int viewPageCnt, Map<String,String> searchKeyMap) throws Exception;

}
